package com.hqyj.javaSpringBoot.interceptor;

import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@Component
public class RequestViewInterceptor implements HandlerInterceptor {

    private final static Logger LOGGER= LoggerFactory.getLogger(RequestViewInterceptor.class);

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response,
                             Object handler) throws Exception {
        LOGGER.debug("======preHandle interceptor==========");
        //如果返回的是false,请求不继续往下传了，直接沿着来的链往回跑。
        return true;
    }

    /**
     * getServletPath():获取能够与“url-pattern”中匹配的路径，注意是完全匹配的部分，*的部分不包括。
     * getPathInfo():与getServletPath()获取的路径互补，能够得到的是“url-pattern”中*d的路径部分
     * getContextPath():获取项目的根路径
     * getRequestURI:获取根路径到地址结尾
     * getRequestURL:获取请求的地址链接（浏览器中输入的地址）
     * getServletContext().getRealPath("/"):获取“/”在机器中的实际地址
     * getScheme():获取的是使用的协议(http 或https)
     * getProtocol():获取的是协议的名称(HTTP/1.11)
     * getServerName():获取的是域名(xxx.com)
     * getLocalName:获取到的是IP
     */
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response,
                           Object handler, ModelAndView modelAndView) throws Exception {
        LOGGER.debug("======postHandle interceptor==========");

        //对转发、重定向和登录注册页面进行特殊拦截
        if (modelAndView==null||
                modelAndView.getViewName().toLowerCase().startsWith("redirect")||
                modelAndView.getViewName().toLowerCase().startsWith("forward")){
            HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);
            return;
        }

        // 判断 modelAndView的modelmap 中是否已经设置有 template（index页面接收的参数名称）
        String  path=(String) modelAndView.getModel().get("template");
        if (StringUtils.isBlank(path)){
            String servletPath = request.getServletPath();
            //配置文件中设置了 /,所以需要截断第一位
            //spring.thymeleaf.prefix=classpath:/templates/
            if (servletPath.startsWith("/")){
                servletPath=servletPath.substring(1);
            }
            modelAndView.getModelMap().put("template",servletPath);
        }
        HandlerInterceptor.super.postHandle(request,response,handler,modelAndView);

    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response,
                                Object handler, Exception ex) throws Exception {
        LOGGER.debug("======afterCompletion interceptor==========");
    }
}
